#include<iostream>
#include<vector>
#include<memory>

class Test
{
public:
    Test(){a=new int;}
    Test(const Test& t)
    {
        std::cout<<"拷贝"<<std::endl;
        a=new int(*t.a);
    }
    Test(Test &&t)//右值引用  移动构造函数
    {   //夺取内存所有权
        std::cout<<"移动构造!\n";
        a=t.a;
        t.a=nullptr;
    }

private:
    int *a;
};


int main()
{
    //左值：有内存的值
    //右值：常量  将亡值(c++11) rvo
    
    //int a=10;
    //int &b=a;//左值引用

    //const int&c=10;//常引用
    
    //int &&c=10;//右值引用
    
    //移动语义
    //move
    //int &&d=std::move(a);//将左值变成右值

    //Test t1;
    //Test t2=std::move(t1);
    //STL支持移动语义

    // std::vector<std::vector<int>>v;
    // std::vector<int>v1={2,5,8,8};
    // v.push_back(std::move(v1));

    // std::unique_ptr<int> p=std::make_unique<int>();
    // *p=10;
    // auto p1=std::move(p);
    std::vector<std::unique_ptr<int>>v;
    std::unique_ptr<int> p=std::make_unique<int>();
    v.push_back(std::move(p));



    return 0;
}